//
//  HMLoginViewModel.swift
//  HMWeiBo
//
//  Created by Apple on 16/7/31.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit
/*
    放什么?
    1. 网络请求
    2. Model
    3. 放对Model的数据处理
    
    
*/
class HMLoginViewModel: NSObject {

    
    // 由于多次用到ViewModel,可以把ViewModel变成单例,只有一块内存区域
    // 1. 方便调用
    // 2. 防止每次创建对象都去沙盒读取 model
    
    static let shareInstance: HMLoginViewModel = HMLoginViewModel()
    
    // 创建一个model
    // 赋值 
    //TODO: -- 当我们页面跳转完成之后,再来给大家验证这个思路
    /*
        1. 当第一次运行的时候,授权成功之后,要给model赋值
        2. 已经保存在沙盒里,需要去沙盒里读取
    */
    var model: HMUserInfoModel?
    
    // 计算型属性,没有分配空间
    var access_token: String? {
    
        return model?.access_token //+ "aaa"
        
    }
    
    // 判断有没有登录
    var isLogin: Bool {
    
        return model?.access_token == nil ? false : true
        
    }
    
    
   private override init() {
        
        // 在ViewModel 初始化的时候给model赋值
        model = HMUserInfoModel.readModel()
        
    }
    
    // 网络加载Token
    func loadToken(code: String,success: ()->(),failed: (message: String)->()){
        
        
        // 1.
        let urlString = "https://api.weibo.com/oauth2/access_token"
        // 2.
        // 网络请求方式是POST
        
        // 3. 看参数 -- 重点看必选
        /* 一.方便查看.二 防止 key 赋值错误
        必选	类型及范围	说明
        client_id	true	string	申请应用时分配的AppKey。
        client_secret	true	string	申请应用时分配的AppSecret。
        true	string	请求的类型，填写authorization_code
        
        grant_type为authorization_code时
        必选	类型及范围	说明
        code	true	string	调用authorize获得的code值。
        redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
        */
        // 一个key-value 就是一行,方便我们查看,防止丢参数
        let params = ["client_id":AppKey,
            "client_secret":AppSecret,
            "grant_type":"authorization_code",
            "code":code,
            "redirect_uri": RedrectURL
        ]
        
        // 注意: 打印一下 我们拼接的字典,方便和后台进行调试
        printLog(params)
        
        HMHTTPClient.shareInstance.request(.POST, URLString: urlString, parameters: params, progress: nil, success: { (_, JSON) -> Void in
            
            // let JSON: AnyObject?
            printLog(JSON)
            
            // 1. 可选项先解包: if let ;guard ;?? ;if
            
            guard let json = JSON else {
                
                return
            }
            
            // 2. 把 AnyObject 转换成一个字典类型
            let dict = json as! [String: AnyObject]
            // 3. 字典转模型
            let model = HMUserInfoModel(dict: dict)
            
            printLog(model.access_token)
            // 2.00TB2V3Gz9wJXBbb7435c072oBCwHC
            
            // 4. 加载请求个人数据 -- 闭包里用self
            //            self.loadPersonalInfo(model)
            self.loadPersonalInfo(model, success: success, failed: failed)
           
            }) { (_ , error) -> Void in
                
                
                failed(message: error.description)
        }
        
    }
    
    
    private func loadPersonalInfo(model: HMUserInfoModel,success: ()->(),failed: (message: String)->()){
        
        
        // 1. url
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        // 2. 拼接参数
        /*
        access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
        uid	false	int64	需要查询的用户ID。
        */
        // let params: [String : String?]
        // model.access_token 是一个可选的 if let; guard let ;?? ;if
        guard  let token = model.access_token,uid = model.uid else {
            printLog("token 和uid  必须有")
            return
        }
        
        let params = ["access_token":token,
            "uid":uid
        ]
        
        printLog(params)
        // [String : String?] 这个类型不能转换成 AnyObject?
        
        // 3. 查看请求方式
        HMHTTPClient.shareInstance.request(.GET, URLString: urlString, parameters: params, progress: nil, success: { (_ , JSON) -> Void in
            
            printLog(JSON)
            
            // 把json 转换
            /*
            // 1. 可选项先解包: if let ;guard ;?? ;if
            
            guard let json = JSON else {
            
            return
            }
            
            // 2. 把 AnyObject 转换成一个字典类型
            let dict = json as! [String: AnyObject]
            */
            
            guard let json = JSON as? [String: AnyObject] else {
                return
            }
            
            // 给模型赋值
            // let name: AnyObject? 为什么是 可选? 因为字典的key所对应的值不一定存在
            
            //            let name = json["screen_name"]
            //            name as? String
            
            // 由于 json["screen_name"] 是一个可选的,所以 as 用 可选as -> as?
            model.screen_name = json["screen_name"] as? String
            
            model.profile_image_url = json["profile_image_url"] as? String
            
            printLog(model.profile_image_url)
            
            // 在归档之前,给ViewModle里的 model赋值
            self.model = model
            // 进行归档保存
            model.saveModel()
            
            // 比较一下  model.saveModel()
//            NSKeyedArchiver.archiveRootObject(model, toFile: HMUserInfoModel.userInfoPath)
            
            // 保存成功之后,进行回调,
            success()
            
            }) { (_ , error) -> Void in
                //                SVProgressHUD.showErrorWithStatus(error.description)
                failed(message: error.description)
        }
        
    }
}
